Swagger2Markup bug-生成的 html 文档有问题当 ApiModel value 包含斜线
错误描述
此问题的由来是因为某天看用 asciidoctor-maven-plugin
生成的 swagger html 文档时, 发现有个链接没法跳转到指定的 header.如下图所示:
经过排查发现是因为 ApiModel
的 value
包含 /
时会出现问题.以上面的问题为例, 写了一个简单的示例, 如下:
Controller
有一个方法:
1 | "...", method = RequestMethod.POST) (value= |
Order
类定义如下:
1 | // 带有斜线 / |
错误排查
首先查看生成的 html 文件:
1 | // 跳转链接的 ID 是 _create_order |
进一步排查生成的 .adoc
文件.在 paths.adoc
、definitions.adoc
文件中搜索 create_order
相关的信息.
paths.adoc
内容如下:
1 | ==== Parameters |
definitions.adoc
内容如下:
1 | [[_order_create_order]] |
很明显, 这两个 ID 是不一样的.就导致了生成的 html 文档也有问题.
这会导致如下两个问题:
- 链接无法跳转到指定的 header
- 请求/响应示例无法生成
错误原因分析
针对上面的两个问题, 分别做下错误原因分析:
链接无法跳转到指定的 header:
GenericRef
类有两个属性,ref
和simpleRef
.以上面的例子为例(order/create_order
),ref
是#/definitions/order/create_order
,simpleRef
是create_order
.simpleRef
不包含order
前缀.所以在生成链接 id 的时候, 可能是一个使用了simpleRef
, 另外一个使用了ref
, 所以应该统一使用其中一个.请求/响应示例无法生成:
Swagger#getDefinitions()
方法返回的是Map<String, Model>
, 这个 map 里面包含了/order/create_order
, 但是不包含create_order
, 所以当生成示例的时候, 可能是使用的simpleRef
从 map 中获取Model
对象(此时肯定获取不到).如果使用ref
(去除#/definitions/
前缀)可以从 map 中获取Model
对象, 所以应该先使用simpleRef
, 如果获取不到Model
, 再使用ref
.
- 感谢您的阅读,本文由 ykgarfield 版权所有。如若转载,请注明出处:ykgarfield
- 文章链接: https://ykgarfield.github.io/2019/01/01/文档工具/swagger/Swagger2Markup bug-生成的 html 文档有问题当 ApiModel value 包含斜线/